/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.intec.matsab.persistence;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.Pattern;

/**
 *
 * @author Sabrina
 */
@Entity
@Table(name = "Estudiante")
@NamedQueries({@NamedQuery(name = "Estudiante.findAll", query = "SELECT e FROM Estudiante e"),
    @NamedQuery(name = "Estudiante.findByMatricula", query = "SELECT e FROM Estudiante e WHERE e.matricula = :matricula"),
    @NamedQuery(name = "Estudiante.findByApellidos", query = "SELECT e FROM Estudiante e WHERE e.apellidos = :apellidos"),
    @NamedQuery(name = "Estudiante.findByNombres", query = "SELECT e FROM Estudiante e WHERE e.nombres = :nombres"),
    @NamedQuery(name = "Estudiante.findByFechaNacimiento", query = "SELECT e FROM Estudiante e WHERE e.fechaNacimiento = :fechaNacimiento"),
    @NamedQuery(name = "Estudiante.findBySexo", query = "SELECT e FROM Estudiante e WHERE e.sexo = :sexo"),
    @NamedQuery(name = "Estudiante.findByCarrera", query = "SELECT e FROM Estudiante e WHERE e.pensum.carrera.idCarrera = :idCarrera"),
    @NamedQuery(name = "Estudiante.findByNombreApellido", query = "SELECT e FROM Estudiante e WHERE e.nombres = :nombre AND e.apellidos = :apellido ")})

public class Estudiante implements Serializable {

    private static final long serialVersionUID = 1L;
    
    @NotEmpty( message="Este campo es requerido")
    @Pattern(regex = "\\d+", message = "Este campo solo debe contener numeros 0-9")
    @Length(min = 6, max = 6, message="Este campo tiene un maximo de 6 numeros")
    @Id
    @Basic(optional = false)
    @Column(name = "matricula")
    private String matricula;

    @NotEmpty( message="Este campo es requerido")
    @Pattern(regex = "[a-zA-Z ]+", message = "Este campo solo debe contener letras a-z/A-Z")
    @Length(min = 1, max = 50, message="Este campo tiene un maximo de 50 caracteres")
    @Basic(optional = false)
    @Column(name = "apellidos")
    private String apellidos;

    @NotEmpty( message="Este campo es requerido")
    @Pattern(regex = "[a-zA-Z ]+", message = "Este campo solo debe contener letras a-z/A-Z")
    @Length(min = 1, max = 50, message="Este campo tiene un maximo de 50 caracteres")
    @Basic(optional = false)
    @Column(name = "nombres")
    private String nombres;

    @Basic(optional = false)
    @Column(name = "fecha_nacimiento")
    @Temporal(TemporalType.DATE)
    private Date fechaNacimiento;

    @Basic(optional = false)
    @Column(name = "sexo")
    private char sexo;

    @Lob
    @Column(name = "foto")
    private byte[] foto;

    @Pattern(regex = "([_a-zA-Z\\d\\-\\.]+@[_a-zA-Z\\d\\-]+(\\.[_a-zA-Z\\d\\-]+)+)", message = "Formato de correo invalido")
    @Length(min = 1, max = 50, message="Este campo tiene un maximo de 50 caracteres")
    @Column(name = "email")
    private String email;

    @JoinColumns({@JoinColumn(name = "idPensum", referencedColumnName = "idPensum"),
    @JoinColumn(name = "idCarrera", referencedColumnName = "idCarrera")})
    @ManyToOne(optional = false)
    private Pensum pensum;

    @JoinColumn(name = "idEstado", referencedColumnName = "idEstado")
    @ManyToOne(optional = false)
    private Estado idEstado;
    
    @JoinColumn(name = "idUsuario", referencedColumnName = "idUsuario")
    @ManyToOne(cascade=CascadeType.ALL)
    private Usuario idUsuario;

    public Estudiante() {
    }

    public Estudiante(String matricula) {
        this.matricula = matricula;
    }

    public Estudiante(String matricula, String apellidos, String nombres, Date fechaNacimiento, char sexo, String email) {
        this.matricula = matricula;
        this.apellidos = apellidos;
        this.nombres = nombres;
        this.fechaNacimiento = fechaNacimiento;
        this.sexo = sexo;
        this.email = email;
    }

    public String getMatricula() {
        return matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    public char getSexo() {
        return sexo;
    }

    public void setSexo(char sexo) {
        this.sexo = sexo;
    }

    public byte[] getFoto() {
        return foto;
    }

    public void setFoto(byte[] foto) {
        this.foto = foto;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    public void setIdUsuario(Usuario idUsuario) {
        this.idUsuario = idUsuario;
    }

    public Usuario getIdUsuario() {
        return idUsuario;
    }

    public Pensum getPensum() {
        return pensum;
    }

    public void setPensum(Pensum pensum) {
        this.pensum = pensum;
    }

    public Estado getIdEstado() {
        return idEstado;
    }

    public void setIdEstado(Estado idEstado) {
        this.idEstado = idEstado;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (matricula != null ? matricula.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Estudiante)) {
            return false;
        }
        Estudiante other = (Estudiante) object;
        if ((this.matricula == null && other.matricula != null) || (this.matricula != null && !this.matricula.equals(other.matricula))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "edu.intec.matsab.persistence.Estudiante[matricula=" + matricula + "]";
    }
}